﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace Noris.Tools.TraceVisualiser.Components
{
	public static class PicLibrary22
	{
		#region Image Gofirst2
		/// <summary>
		/// Vrátí obrázek, vytvořený na základě obrázku go-first-2.png.
		/// Vrací přímou referenci na objekt v paměti = volání je velice rychlé (pod 1 mikrosekundu), 
		/// ale protože se vrací živá reference, pak zásahy do vráceného objektu se projeví v objektu v paměti = natrvalo.
		/// Případně je možno vyvolat metodu Gofirst2_Reset(), která zajistí regenerování obrázku z jeho definice.
		/// Bezpečnější je používání property Gofirst2, která vrací vždy nový objekt.
		/// Pro používání pro Button.Image, kde bude nastavováno Button.Enabled = false; je třeba použít property Gofirst2_FromFile.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// D:\Cs2010\TraceAnalyzeTA\TraceAnalyzeTA\pic\go-first-2.png
		/// </remarks>
		public static System.Drawing.Image Gofirst2_Cached
		{
			get
			{
				if (_Gofirst2 == null) _Gofirst2 = Gofirst2;
				return _Gofirst2;
			}
		}
		/// <summary>
		/// Vrátí obrázek, vytvořený na základě obrázku go-first-2.png.
		/// Nelze používat jako Image pro Buttony, kde bude nastavováno Enabled = false (pak dojde k chybě .NET: Ot of memory).
		/// Pak je třeba použít Image Gofirst2_FromFile.
		/// Vrací vždy novou instanci = volání je při častém používání výrazně (až 1000krát) pomalejší než použití Gofirst2_Cached
		/// (kde ale hrozí nebezpečí pokažení obrázku v paměti).
		/// Čas pro vytvoření jednoho Image (tj. každé jednotlivé čtení této property) pro obrázek velikosti 32x32 px (32bpp) je průměrně 350 mikrosekund.
		/// Pokud je třeba používat obrázek často a rychle, je možné využít property Gofirst2_Cached.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// D:\Cs2010\TraceAnalyzeTA\TraceAnalyzeTA\pic\go-first-2.png
		/// </remarks>
		public static System.Drawing.Image Gofirst2 { get { return _ImageCreateFrom(_Gofirst2_string, null); } }
		/// <summary>
		/// Vrátí obrázek, načtený ze souboru go-first-2.png.
		/// Vrací vždy novou instanci = volání je při častém používání výrazně (až 1000krát) pomalejší než použití Gofirst2_Cached
		/// (kde ale hrozí nebezpečí pokažení obrázku v paměti).
		/// Čas pro vytvoření jednoho Image (tj. každé jednotlivé čtení této property) pro obrázek velikosti 32x32 px (32bpp) je průměrně 350 mikrosekund.
		/// Pokud je třeba používat obrázek často a rychle, je možné využít property Gofirst2_Cached.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// D:\Cs2010\TraceAnalyzeTA\TraceAnalyzeTA\pic\go-first-2.png
		/// </remarks>
		public static System.Drawing.Image Gofirst2_FromFile { get { return _ImageCreateFrom(_Gofirst2_string, "go-first-2.png"); } }
		/// <summary>
		/// Vygeneruje a vrátí string, který definuje obsah souboru Gofirst2
		/// </summary>
		/// <returns></returns>
		private static string _Gofirst2_string()
		{
			System.Text.StringBuilder sb = new System.Text.StringBuilder(1824);
			sb.Append("iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAWAAAAFgDcxelYAAAD");
			sb.Append("T0lEQVQ4y7WVb2jWVRTHP+fe+/vt2WpUw9qUYtE0JImEJFjPmoKi/ZlBpZMK+mcRGeWbp8jqRQSlaEH0xgoxAt9kRW+WBbJCSNE0TQhDqUWt0OXaxtLteX6/372nF/u5");
			sb.Append("Hm3P5hsvHC5czvncc8/9Ho6oKpdimUtCBeT2kjuF0vzfCb/v3ZK21goolqIHxPDct5vTJdOBHUrzM2teBkBVeW/nxjk1gIKw8dpr2p7/469f6i+6FJ/8sKmmU7EUNYph");
			sb.Append("9y3z2tc/de+GGaETGc+wiqVorhh6l912/+xF8xdHzkYXVWM3A3SFc3U7Vy19vPHqphY51P8ld7R1I5ZysRT9X07CwN4tacu04OIL0YYrG2e9unrZ2oYxHeZQ/y6ciQkh");
			sb.Append("47UnthWMGEQMggACwCvvPzIpgqnA0vFi9Hnr7HnL7+nobugbPsrA6K9Y41BVdh//EGscVtwEOId3tq2ZphQTF7NwfvtdixZ01B3s/4J/KsM4ExE0oBoIONREqGQIBlGD");
			sb.Append("qpKFtDZYEO5c2mWvuqzFfnNiB5kmWBOhBAIBnCeVs3ifkGVlspAganBSINWxmT8vaEYaKqS+jEgF1YCJFchwkcE4wVhBBDQoFT/OWT90HuO8llaUr3p7wvGfj1WWzH2Q");
			sb.Append("y+uaqGRjeFMBm+FiQ1RniAuGuMFQV2+I6y1RwWKc1AYzISA9/OOBr3v37Rpvb72P65tuxljBOMFGgo2FqDABjBssUcHgYsHkJBGxNUux/x3/dPJk3/rRMzuevXvxqsKs");
			sb.Append("K5r5aWQPRoSuG0pYJ5jIYAz4TPGpErJJWcciUq6l4/jwNr/9xq6/+z4tf7R5RefKhuJ13XJksAeAtz54PfGJxlM0yOk8WVcLbAB7oid8N9o/vjZNP3u3/dbOpuKCh1zw");
			sb.Append("ik803vd21gFUcitX7QaQWuAAeMCfOqq/jf6ZPeqTPW8MDp2+aXnnykLu46ss5KbnYifBqxe+RNU0SfJ2USCMDZIe3OrXpY8dWzcyMtQNFIDx3C+t2lMgVVXvEAa2fvxm");
			sb.Append("c1W2J/MneSDKg6wGzJHtflPSffL7xjnmYeAMkFUBE2BcVRMAuXDmiUgExDnUATavW7U0zz3d59AKkKhqmOTUGqYiYqqgNrcLoV5V/VTx/wITjlbsxu1CYgAAACV0RVh0");
			sb.Append("Y3JlYXRlLWRhdGUAMjAwOS0xMS0xMFQxOTozODoyMC0wNzowMIB9jfEAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTAtMDItMjBUMjM6MjY6MTUtMDc6MDAGO1yBAAAAJXRF");
			sb.Append("WHRkYXRlOm1vZGlmeQAyMDEwLTAxLTExVDA4OjU2OjMxLTA3OjAwsDTlYgAAADJ0RVh0TGljZW5zZQBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1B1YmxpY19k");
			sb.Append("b21haW4//erPAAAAJXRFWHRtb2RpZnktZGF0ZQAyMDA5LTExLTEwVDE5OjM4OjIwLTA3OjAw38z7xQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoA");
			sb.Append("AAAZdEVYdFNvdXJjZQBUYW5nbyBJY29uIExpYnJhcnlUz+2CAAAAOnRFWHRTb3VyY2VfVVJMAGh0dHA6Ly90YW5nby5mcmVlZGVza3RvcC5vcmcvVGFuZ29fSWNvbl9M");
			sb.Append("aWJyYXJ5vMit1gAAAABJRU5ErkJggg==");
			return sb.ToString();
		}
		/// <summary>
		/// Resetuje obrázek v paměti.
		/// Následující použití property Gofirst2_Direct si vytvoří nový, korektní - podle jeho originální deklarace.
		/// Tuto metodu je vhodné použít v situaci, kdy je správnost obrázku v paměti nejistá.
		/// </summary>
		public static void Gofirst2_Reset()
		{
			_Gofirst2 = null;
		}
		/// <summary>
		/// Úložiště objektu v paměti, při prvním použití Gofirst2_Direct je objekt naplněn a následně využíván.
		/// </summary>
		private static System.Drawing.Image _Gofirst2 = null;
		#endregion
		#region Image Golast2
		/// <summary>
		/// Vrátí obrázek, vytvořený na základě obrázku go-last-2.png.
		/// Vrací přímou referenci na objekt v paměti = volání je velice rychlé (pod 1 mikrosekundu), 
		/// ale protože se vrací živá reference, pak zásahy do vráceného objektu se projeví v objektu v paměti = natrvalo.
		/// Případně je možno vyvolat metodu Golast2_Reset(), která zajistí regenerování obrázku z jeho definice.
		/// Bezpečnější je používání property Golast2, která vrací vždy nový objekt.
		/// Pro používání pro Button.Image, kde bude nastavováno Button.Enabled = false; je třeba použít property Golast2_FromFile.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// D:\Cs2010\TraceAnalyzeTA\TraceAnalyzeTA\pic\go-last-2.png
		/// </remarks>
		public static System.Drawing.Image Golast2_Cached
		{
			get
			{
				if (_Golast2 == null) _Golast2 = Golast2;
				return _Golast2;
			}
		}
		/// <summary>
		/// Vrátí obrázek, vytvořený na základě obrázku go-last-2.png.
		/// Nelze používat jako Image pro Buttony, kde bude nastavováno Enabled = false (pak dojde k chybě .NET: Ot of memory).
		/// Pak je třeba použít Image Golast2_FromFile.
		/// Vrací vždy novou instanci = volání je při častém používání výrazně (až 1000krát) pomalejší než použití Golast2_Cached
		/// (kde ale hrozí nebezpečí pokažení obrázku v paměti).
		/// Čas pro vytvoření jednoho Image (tj. každé jednotlivé čtení této property) pro obrázek velikosti 32x32 px (32bpp) je průměrně 350 mikrosekund.
		/// Pokud je třeba používat obrázek často a rychle, je možné využít property Golast2_Cached.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// D:\Cs2010\TraceAnalyzeTA\TraceAnalyzeTA\pic\go-last-2.png
		/// </remarks>
		public static System.Drawing.Image Golast2 { get { return _ImageCreateFrom(_Golast2_string, null); } }
		/// <summary>
		/// Vrátí obrázek, načtený ze souboru go-last-2.png.
		/// Vrací vždy novou instanci = volání je při častém používání výrazně (až 1000krát) pomalejší než použití Golast2_Cached
		/// (kde ale hrozí nebezpečí pokažení obrázku v paměti).
		/// Čas pro vytvoření jednoho Image (tj. každé jednotlivé čtení této property) pro obrázek velikosti 32x32 px (32bpp) je průměrně 350 mikrosekund.
		/// Pokud je třeba používat obrázek často a rychle, je možné využít property Golast2_Cached.
		/// </summary>
		/// <remarks>
		/// Plné jméno vstupního souboru:
		/// D:\Cs2010\TraceAnalyzeTA\TraceAnalyzeTA\pic\go-last-2.png
		/// </remarks>
		public static System.Drawing.Image Golast2_FromFile { get { return _ImageCreateFrom(_Golast2_string, "go-last-2.png"); } }
		/// <summary>
		/// Vygeneruje a vrátí string, který definuje obsah souboru Golast2
		/// </summary>
		/// <returns></returns>
		private static string _Golast2_string()
		{
			System.Text.StringBuilder sb = new System.Text.StringBuilder(1792);
			sb.Append("iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAWAAAAFgDcxelYAAAD");
			sb.Append("OElEQVQ4y7WVXWgcVRTHf+fO3Oxm1RZS2KAhaqEUzENR0NBmi6JgQREViYU+CYIfD4JIssVK6ZO2ghEfREKRUkW03RSlRSWYFKqxqWhpjc22UWmrldVuqq2hxu7HzNzj");
			sb.Append("w2632002qQ8dOFy4c+Z3zvz/Z+aKqnI9LnNdqIC/WMLajfZLdbw9PhB83CwnlbZnUG6tbQjTi4LVcV9nckV3Km3vQdk0PhDM1U655fn1mxARAAYzW9uvSYpnH9/cetfK");
			sb.Append("1ItiGE3125ua5e2ZeP3/aewbn4d7NsTXre69VwzZVL9dcc0ap9I2j9LemCAexUjD+NHcCHcs77bLliY7h0Z3HEn12/XjA8EXi4JR2l977n1AahuKouriTkPKOsvE9AjL");
			sb.Append("21bJM0/0L9k1vP2TVNq+Ov5GsG1hMBC6gK9PDV3BqgNR8CLUhCgRP//9DcnEbTz12AuJfQc+2rx2o+2u62Z+cORCSuGlOh0c4oOIQ02ESoRqyB+FE8yUzvLIA72JbyfG");
			sb.Append("Hjo8eXAO+ipwKbxEbuYnylEBVUc8HieRuIFEPIH1WhCjQIhKwEyY41Auw6qudbH2jjakgXwV+GLxL/4pnb9sGmiZKJylUDZ4aojZGJ7xEfGIxGGMQyUEo3Pmq+m4GSOV");
			sb.Append("8ATPF3wrYAOcLRJ6s9zYuoQ1nb0cn8qWPhv+1DWK3PTLEwExUglPML7gWYPxhJtjXdweW8PnI3sLv5w5/ZUYHpzXPBExPX2VGk/e+XKlY7/SqedXoKNn38Lzha62+2kt");
			sb.Append("dvDhnp3F/G8Xth/dEb3T0+f/KE3M84Fzg5mtyTmSWMovPb2lxZo4dy97lJk//9Xd+94t/P5D8ZWTw24MaFlojuXQm+FKIAbE69eePv8wCquTG5g8NhmOHTxw4eRIlD6X");
			sb.Append("1VOAVw0af+uXwQq4utUBUTUolUuMju0vTk2dmDq2K9xSOM/FuvvRQh2H1cpBdVKkGgqwe+97xdyv+aHvd0aD6mpFQ6BcfQZ1WvOnBlZVJyKlhu4jwGrEd6ez+Q+ymWh/");
			sb.Append("XbF6eADkBzPbOq6MFNPSeOaJiK0aYquFvepb1M98vVwBUALKqupqnGaHqYiYOmjNpEYPVHVejf8DfehYO16WDdoAAAAldEVYdGNyZWF0ZS1kYXRlADIwMDktMTEtMTBU");
			sb.Append("MTk6Mzg6MjAtMDc6MDCAfY3xAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDEwLTAyLTIwVDIzOjI2OjE1LTA3OjAwBjtcgQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxMC0wMS0x");
			sb.Append("MVQwODo1NjozMC0wNzowMBZD7tYAAAAydEVYdExpY2Vuc2UAaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QdWJsaWNfZG9tYWluP/3qzwAAACV0RVh0bW9kaWZ5");
			sb.Append("LWRhdGUAMjAwOS0xMS0xMFQxOTozODoyMC0wNzowMN/M+8UAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAGXRFWHRTb3VyY2UAVGFuZ28gSWNv");
			sb.Append("biBMaWJyYXJ5VM/tggAAADp0RVh0U291cmNlX1VSTABodHRwOi8vdGFuZ28uZnJlZWRlc2t0b3Aub3JnL1RhbmdvX0ljb25fTGlicmFyebzIrdYAAAAASUVORK5CYII=");
			return sb.ToString();
		}
		/// <summary>
		/// Resetuje obrázek v paměti.
		/// Následující použití property Golast2_Direct si vytvoří nový, korektní - podle jeho originální deklarace.
		/// Tuto metodu je vhodné použít v situaci, kdy je správnost obrázku v paměti nejistá.
		/// </summary>
		public static void Golast2_Reset()
		{
			_Golast2 = null;
		}
		/// <summary>
		/// Úložiště objektu v paměti, při prvním použití Golast2_Direct je objekt naplněn a následně využíván.
		/// </summary>
		private static System.Drawing.Image _Golast2 = null;
		#endregion
		#region SPOLEČNÉ METODY PRO KONVERZI
		/// <summary>
		/// Vrátí Image z definice (string). Image generuje buď v paměti, anebo s pomocí souboru.
		/// Pokud není zadán parametr (cacheFileName) (když je null), generuje se Image v paměti.
		/// Pokud je soubor (cacheFileName) definován, pak se Image čte z něj.
		/// Pokud soubor neexistuje, nejprve se vytvoří.
		/// Umístění souboru (adresář) je dán property _ImageCacheDir, defaultně je to adresář (Sys:\Documents and Settings\All Users\Data aplikací\IconCache).
		/// Obsah obrázku definuje metoda getDataMethod.
		/// </summary>
		/// <param name="getDataMethod"></param>
		/// <param name="cacheFileName"></param>
		/// <returns></returns>
		private static System.Drawing.Image _ImageCreateFrom(_GetStringDelegate getDataMethod, string cacheFileName)
		{
			System.Drawing.Image image;
			if (cacheFileName == null)
			{
				using (System.IO.MemoryStream ms = new System.IO.MemoryStream(Convert.FromBase64String(getDataMethod())))
				{
					image = System.Drawing.Image.FromStream(ms);
				}
				return image;
			}
			string fileName = System.IO.Path.Combine(_ImageCacheDir, cacheFileName);
			if (!System.IO.File.Exists(fileName))
				System.IO.File.WriteAllBytes(fileName, Convert.FromBase64String(getDataMethod()));
			if (System.IO.File.Exists(fileName))
				return Image.FromFile(fileName);
			return null;
		}
        /// <summary>
        /// Obsahuje jméno adresáře, který slouží jako Cache pro obrázky systému.
        /// </summary>
        private static string _ImageCacheDir
        {
            get
            {
                if (__ImageCacheDir == null)
                    __ImageCacheDir = Noris.Tools.TraceVisualiser.Support.Steward.GetUserAppDataPath(@"IconCache\PicsC22");
                return __ImageCacheDir;
            }
        }
        private static string __ImageCacheDir;
		/// <summary>
		/// Předpis pro metody, které generují obsah souboru s daty
		/// </summary>
		/// <returns></returns>
		private delegate string _GetStringDelegate();
		/// <summary>
		/// Vrátí Icon z dat (string), která jsou předána na vstup v kódování Base64
		/// </summary>
		/// <param name="data">Vstupní data v kódování Base64</param>
		/// <returns>Icon vytvořená z dat</returns>
		public static System.Drawing.Icon ConvertStringToIcon(string data)
		{
			System.Drawing.Icon icon;
			using (System.IO.MemoryStream ms = new System.IO.MemoryStream(Convert.FromBase64String(data)))
			{
				icon = new System.Drawing.Icon(ms);
			}
			return icon;
		}
		/// <summary>
		/// Vrátí Cursor z dat (string), která jsou předána na vstup v kódování Base64
		/// </summary>
		/// <param name="data">Vstupní data v kódování Base64</param>
		/// <returns>Cursor vytvořený z dat</returns>
		public static System.Windows.Forms.Cursor ConvertStringToCursor(string data)
		{
			System.Windows.Forms.Cursor cursor;
			using (System.IO.MemoryStream ms = new System.IO.MemoryStream(Convert.FromBase64String(data)))
			{
				cursor = new System.Windows.Forms.Cursor(ms);
			}
			return cursor;
		}
		#endregion
	}
}
